from knglib.baselib import checkVariableType
from interface      import Package, PackageException, PackageConfigException
import variables, os


def openpackage(filename):
    """Abre filename somente para leitura e passa
    o filedescriptor para a classe Package, depois
    retorna uma instancia da mesma."""
    fp = open(filename, 'r')
    return Package(fp)


def checkOfficial(package):
    """Verifica se o nome e MD5 do pacote esta
    presente na lista dos pacotes oficiais.
    return: boolean"""
    checkVariableType('package', Package, package)
    md5 = variables.PACKAGES_MD5.get(package.getFilename())
    if md5 is not None:
        return md5 == package.getMD5()
    
    return False


def getInstalleds():
    """Retorna a lista dos pacotes instalados."""
    path = variables.PACKAGES_PATH + '/' + variables.PACKAGES_INSTALLED_DIR
    return [f.lower() for f in os.listdir(path)]


def validateConfig(config):
    """Valida uma instancia de ConfigParser nos
    padroes do package.conf dos pacotes .kng.
    Essa funcao emite PackageConfigException caso
    as configuracoes nao estejam de acordo com a
    extrutura do package.conf."""
    #Verifica a existencia da section General
    gs = config.getSection(variables.PACKAGE_CONFIG_DEFAULT_HEADER)
    if gs is None:
        raise PackageConfigException('General section is not present.')
    
    #Verifica se os campos obrigatorios estao presentes
    check = True
    opts = gs.getOptionsName()
    for opt in variables.PACKAGE_CONFIG_REQUIRED_FIELDS:
        check &= opt in opts
        if not check:
            raise PackageConfigException('Required field \'%s\' is not present in configuration file.' % opt)
    
    #Checa se a categoria do pacote e valida
    cat = gs.get('Category').lower()
    if not cat in variables.PACKAGES_CATEGORIES:
        raise PackageConfigException('\'%s\' is not a valid category.' % cat)



